package com.demo.java.OD101_150.OD135;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【射击比赛】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145728253
 */
public class OdMain {

    public static void main(String[] args) {
        try {
            // 使用Scanner类读取用户输入
            Scanner scan = new Scanner(System.in);

            // 读取选手数量n
            int n = Integer.parseInt(scan.nextLine());
            if (n < 2 || n > 100) {  // 检查选手数量是否在合理范围内
                System.out.println("input error");
                return;
            }

            // 读取选手ID的字符串
            String idStr = scan.nextLine();
            // 读取选手成绩的字符串
            String score = scan.nextLine();

            // 将选手ID和成绩分别分割成数组
            String[] ids = idStr.split(",");
            String[] scoreArray = score.split(",");

            // 创建一个HashMap，存储每个选手的ID和成绩列表
            Map<Integer, List<Integer>> hashMap = new HashMap<>();

            // 遍历每个选手，解析ID和成绩并存储到hashMap中
            for (int j = 0; j < n; ++j) {
                // 解析选手ID
                int idKey = Integer.parseInt(ids[j]);
                if (idKey < 0 || idKey > 99) {  // 校验选手ID是否在0到99之间
                    System.out.println("input error");
                    return;
                }

                // 解析选手成绩
                int scoreValue = Integer.parseInt(scoreArray[j]);
                if (scoreValue < 0 || scoreValue > 100) {  // 校验成绩是否在0到100之间
                    System.out.println("input error");
                    return;
                }

                // 如果选手的ID已经存在，则将该成绩加入到该选手的成绩列表中
                if (hashMap.containsKey(idKey)) {
                    hashMap.get(idKey).add(scoreValue);
                } else {
                    // 如果选手ID还没有记录，则创建一个新的成绩列表并加入该成绩
                    List<Integer> myList = new ArrayList<>();
                    myList.add(scoreValue);
                    hashMap.put(idKey, myList);
                }
            }

            // 创建一个List，用于存储每个选手的ID和其前三次最好成绩的总和
            List<List<Integer>> allLists = new ArrayList<>();

            // 遍历每个选手和他们的成绩
            hashMap.forEach((key, value) -> {
                // 创建一个新的List来存储选手ID和前三次最好成绩的总和
                List<Integer> dataList = new ArrayList<>();
                if (3 <= value.size()) {  // 如果选手有3次或以上的成绩
                    // 对成绩进行排序（从低到高）
                    Collections.sort(value);
                    // 添加选手ID到dataList
                    dataList.add(key);
                    // 添加选手的前三次最好成绩的总和（即最后3个成绩的和）
                    dataList.add(
                            value.get(value.size() - 1) + value.get(value.size() - 2) + value.get(value.size() - 3)
                    );
                }
                // 将这个选手的ID和成绩总和添加到allLists中
                allLists.add(dataList);
            });

            // 根据成绩总和进行排序：先按成绩总和降序排序，如果成绩总和相同，则按选手ID升序排序
            allLists.sort((x, y) -> {
                if (x.get(1) < y.get(1)) {
                    return 1;  // 如果x的总成绩较低，则y排在前面
                }
                if (x.get(0) < y.get(0)) {
                    return 1;  // 如果总成绩相同，则按选手ID升序
                }
                return -1;  // 如果x的总成绩较高，则x排在前面
            });

            // 使用StringBuilder来构建输出的结果字符串
            StringBuilder sb = new StringBuilder();

            // 遍历所有选手的排名，拼接选手ID
            for (int i = 0; i < allLists.size() - 1; ++i) {
                sb.append(allLists.get(i).get(0)).append(",");  // 拼接每个选手ID，并用逗号分隔
            }

            // 拼接最后一个选手ID（不加逗号）
            String result = sb.toString() + allLists.get(allLists.size() - 1).get(0);
            System.out.print(result);  // 输出最终的排名结果
        } catch (Exception e) {
            // 捕获并输出任何异常
            e.printStackTrace();
            System.out.println("input error");  // 输入错误时输出错误提示
        }
    }
}
